/**
 *
 * Copyright (c) 2006-2007 Berlin Brown and botnode.com/Berlin Research  All Rights Reserved
 *
 * http://www.opensource.org/licenses/bsd-license.php

 * All rights reserved.

 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:

 * * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * * Neither the name of the Botnode.com (Berlin Brown) nor
 * the names of its contributors may be used to endorse or promote
 * products derived from this software without specific prior written permission.

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Date: 12/15/2009 
 *   
 * Home Page: http://botnode.com/
 * 
 * Contact: Berlin Brown <berlin dot brown at gmail.com>
 * 
 * Also see: http://htmlcleaner.sourceforge.net/doc/org/htmlcleaner/class-use/TagNode.html
 */
package org.bresearch.octane.parse;

import java.net.MalformedURLException;
import java.net.URL;

import org.bresearch.octane.parse.html.HtmlLink;
import org.bresearch.octane.utils.StringUtil;
import org.htmlcleaner.TagNode;

/**
 * Validate the href links as they are processed.
 *
 */
public class ValidLinkBuilder extends LinkBuilder {
    
    private final String url;
    private Throwable lastError;
    
    public ValidLinkBuilder(final String url, final TagNode parentNode) {
        
        super(parentNode);        
        this.url = url;
        
    }

    public String getHost() {
        try {
            final URL url = new URL(this.url);
            return url.getProtocol() + "://" + url.getHost();
        } catch (MalformedURLException e) {
            this.lastError = e;
        }
        return this.url;
    }
    
    public String buildFullHref(final String href) {
        
        final StringUtil utils = new StringUtil();
        if (utils.isEmpty(href)) {
            // Cannot continue, return with URL.
            return url;
        }        
        if ("/".equals(href)) {
            return this.getHost();
        }
        
        if (href.startsWith("http://") || href.startsWith("https://")) {
            return href;
        }
        
        // If the url starts with '/' and there is more to the uri
        // Append to the url
        if (href.startsWith("/") && (href.length() > 1)) {            
            // Avoid having double '/'
            if (this.url.endsWith("/")) {
                // Skip the first '/'
                return this.url + href.substring(1);
            } else {
                return this.url + href;
            } // End of the if - else //
        } else {
            
            // Typical href with no starting root path
            if (this.url.endsWith("/")) {
                return this.url + href;
            } else {
                // No end '/', add it
                return this.url + '/' + href;
            } // End of the if - else //
            
        } // End of the if - else //
                
    }
    
    public void addLink(final String textArg, final String hrefArg) {
        
        final String text = textArg == null ? "" : textArg.trim();
        final String href = hrefArg == null ? "" : hrefArg.trim();         
                        
        this.getListLinks().add(new HtmlLink(text,  this.buildFullHref(href)));
    }
    
} // End of the Class //
